<?php
/**
 * 文件上传处理类
 * @author hdxj <houdunwangxj@gmail.com>
 */
class Upload{
	public $allow_size;//上传允许大小
	public $allow_type;//允许的类型
	public $dir;//上传文件存放目录
	public $error;//记录上传错误
	/**
	 * 构造函数
	 * @param [type] $dir        [上传目录]
	 * @param [type] $allow_size [允许大小]
	 * @param [type] $allow_type [允许类型]
	 */
	public function __construct($dir=null,$allow_size=null,$allow_type=null){
		$this->dir = $dir?$dir:'upload/'.date("Y-m-d").'/';
		$this->allow_size = $allow_size?$allow_size:'2000000';
		$this->allow_type= $allow_type?$allow_type:array('jpeg','jpg','png','gif');
		$this->allow_type= array_change_value_case($this->allow_type);
	}
	/**
	 * 实施上传
	 * @return [type] [description]
	 */
	public function upload(){
		if(empty($_FILES))return false;
		$files = $this->format();
		//将大小溢出的类型不匹配的上传数据过滤掉
		$files = $this->check_file($files);
		//记录成功上传的文件
		$upload=array();
		foreach($files as $file){
			if($this->save($file)){
				$upload[]=$file;
			}
		}
		return $upload;
	}
	/**
	 * 将合法的文件储存到服务器硬盘上
	 * @param  [type] $file [description]
	 * @return [type]       [description]
	 */
	private function save($file){
		is_dir($this->dir) or mkdir($this->dir,0755,true);
		$info = pathinfo($file['name']);
		$to = $this->dir.mt_rand().time().'.'.$info['extension'];
		//移动成功的文件
		if(move_uploaded_file($file['tmp_name'], $to)){
			$file['time']= time();
			$file['ext']=$info['extension'];
			$file['filename']=$to;
			return $file;
		}

	}
	/**
	 * 将$_FILES数组组合成统一的二维数组
	 * @return [type] [description]
	 */
	private function format(){
		$data=array();
		foreach($_FILES as $file){
			//以$up[]形式上传的，转为标准数组结构
			if(is_array($file['name'])){
					$_tmp=array();
					foreach($file['name'] as $k=>$v){
						$_tmp['name']=$file['name'][$k];
						$_tmp['type']=$file['type'][$k];
						$_tmp['tmp_name']=$file['tmp_name'][$k];
						$_tmp['error']=$file['error'][$k];
						$_tmp['size']=$file['size'][$k];
						$data[]=$_tmp;
					}
			}else{
				$data[]=$file;
			}
		}
		return $data;
	}
	/**
	 * 将大小溢出的类型不匹配的上传数据过滤掉
	 * @param  [type] $files 不是$_FILES,是经过format处理后的统一的数组
	 * @return [type]        [description]
	 */
	private function check_file($files){
		$data=array();
		foreach($files as $file){
			//过滤上传出错的文件
			if($file['error']>0){
				continue;
			}
			//不是上传文件的数据，直接过滤掉
			if(!is_uploaded_file($file['tmp_name']))continue;
			//大小溢出的不要了
			if($file['size']>$this->allow_size)continue;
			//非法类型过滤
			$info = pathinfo($file['name']);
			$ext = strtolower($info['extension']);
			if(!in_array($ext,$this->allow_type))continue;
			$data[]=$file;
		}
		return $data;
	}

}